package pubsub

import (
	"fmt"
	"sync"
)

// var rw sync.RWMutex
var wg *sync.WaitGroup
var once *sync.Once // 应用场景：执行多个goroutine，只需要执行一次的时候，就能使用

func read(ch1 <-chan int, ch2 chan<- int) {
	// rw.RLock()   // 读锁
	// rw.RUnlock() // 释放读锁
	// rw.Lock()    //	写锁
	// rw.Unlock()  //	释放写锁
	// wg.Add(1)    //	起几个goroutine函数加几次
	// wg.Done()    //	在goroutine函数中，函数要结束时写上表示完成
	// wg.Wait()    // 等待所有goroutine都结束后使用
	// so.Do()
	for {
		x, ok := <-ch1
		if !ok {
			break
		}
		ch2 <- x * x
	}
	f := func() {
		close(ch2)
	}
	once.Do(f)
}
func RunFunc() {
	a, b := make(chan int, 100), make(chan int, 100)
	wg.Add(2)
	go read(a, b)
	go read(a, b)
	wg.Wait()
	for ret := range b {
		fmt.Println(ret)
	}
}
